/* 
 * File:   Servidor.h
 * Author: max
 *
 * Created on October 19, 2012, 12:31 AM
 */

#ifndef SERVIDOR_H
#define	SERVIDOR_H


#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include "server_Conexion.h"
#include "server_IManejadorSesionEvento.h"
#include "server_IAutenticacionManejadorEvento.h"
#include "server_FileService.h"
#include "server_EcoService.h"
#include "server_ProcesoAutenticacion.h"
#include "server_IAdministradorSesiones.h"
#include "common_Excepcion.h"
#include "common_ServerConfFileManager.h"
#include "common_Repositorio.h"
#include "common_Mutex.h"
#include "server_IAdministradorRepositorioCentral.h"
#include "server_ProcesoNotificacionABMArchivos.h"

using namespace std;
using namespace TP;
using namespace TP::Archivos;
using namespace TP::Procesos;
using namespace TP::Procesos::Eventos;
using namespace TP::Servicios;
using namespace TP::Comunicacion;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Comunicacion {
    
#define USUARIOS_DB_RUTA_ARCHIVO "usersdb.xml"

    
    class Servidor : public IManejadorSesionEvento
                   , public IAutenticacionManejadorEvento 
                   , public IAdministradorSesiones
                   , public IAdministradorRepositorioCentral
    {
        
    public:
        
        Servidor(ServerConfFileManager *pConfiguracion);
        
        virtual ~Servidor();
        
        virtual void Iniciar() throw (Excepcion&);
        
        virtual void Finalizar() throw (Excepcion&);
        
        virtual void eventoErrorComunicacion (IEnviante* pEnviante, const string& pMensaje );
        
        virtual void eventoConexionFinalizada (IEnviante* pEnviante, const string& pMensaje);
        
        virtual void notificarNuevaSesionEvento (Sesion* pSesion);
        
        virtual void notificarErrorAutenticacionEvento (Sesion* pSesion);

        virtual Sesion* getSesionPorNombreUsuario(const string &pNombreUsuario);

        virtual Sesion* getSesionPrimera();

        virtual Sesion* getSesionSiguiente(Sesion* pSesion);        
        
        virtual Repositorio* GetRepositorioPorIdentificador (const string &pNombreUsuario);

        virtual vector<string> GetIdentificadoresRepositorios ();
        
    private:
        
        void IniciarRepositorioCentral() throw (Excepcion &);
        
        void FinalizarRepositorioCentral() throw (Excepcion &);
        
        ServerConfFileManager* _configuracion;
        Conexion* _conexion;
        EcoService* _ecoService;
        FileService* _fileService;
        ProcesoAutenticacion* _procesoAutenticacion;
        ProcesoNotificacionABMArchivos* _procesoNotificacionABMArchivos;
        
        vector<Sesion*> _sesiones;
        Mutex _sesionesMutex;
        
        map<string, Repositorio*> _repositorioCentral;
        Mutex _repositorioCentralMutex;
        
    };
}}


#endif	/* SERVIDOR_H */

